#ifndef __SPARC64_DEFS__
#define __SPARC64_DEFS__

//////////////////////////////////////////////////////////////////////////
// SYSTEM INCLUDE DIRECTIVES
//////////////////////////////////////////////////////////////////////////
#include <pthread.h>
#include <sys/timeb.h>
#include <time.h>		//for nanosleep
#include <assert.h>
#include <mtmalloc.h>

//////////////////////////////////////////////////////////////////////////
// SYSTEM CONSTS
//////////////////////////////////////////////////////////////////////////
#define CACHE_LINE_SIZE	(64)

//////////////////////////////////////////////////////////////////////////
// SYSTEM TYPES
//////////////////////////////////////////////////////////////////////////
typedef unsigned char	_u8;
typedef unsigned short	_u16;
typedef unsigned int	_u32;
typedef long long		_u64;
typedef _u32			tick_t;

//////////////////////////////////////////////////////////////////////////
// SYSTEM MEMORY ALLOCATION
//////////////////////////////////////////////////////////////////////////
//#define ALIGNED_MALLOC(_s)	memalign(8u, _s)

#define ALIGNED_MALLOC(_s)	memalign(CACHE_LINE_SIZE, _s)
#define ALIGNED_FREE(_p)	free(_p)

//////////////////////////////////////////////////////////////////////////
// SYSTEM CAS
//////////////////////////////////////////////////////////////////////////

extern "C" _u32 CASIO_internal(_u32, _u32, _u32 volatile*);
#define ATOMIC_CAS(_a,_o,_n)	CASIO_internal (_n, _o, _a)

extern "C" _u32 CAS64O_internal(void*, void*, void* volatile*);
#define ATOMIC_CASP(_a,_o,_n)	CAS64O_internal (_n, _o, (void* volatile*)_a)


//////////////////////////////////////////////////////////////////////////
// SYSTEM MEMORY BARRIER
//////////////////////////////////////////////////////////////////////////

extern "C" void MEMBAR_ALL(void);
extern "C" void MEMBAR_STORESTORE(void);
extern "C" void MEMBAR_LOADLOAD(void);

#define MB()  MEMBAR_ALL()
#define WMB() MEMBAR_STORESTORE()
#define RMB() MEMBAR_LOADLOAD()

//////////////////////////////////////////////////////////////////////////
// SYSTEM TIME
//////////////////////////////////////////////////////////////////////////
extern "C" tick_t RDTICK(void);

#endif
